import socket

# 实现客户端和服务器端的即时聊天

# 创建一个UDP的socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# bind 三种IP地址的写法：
#   IP:172.1.128.64 其他主机可以和当前的服务端通信
#   IP：127.0.0.1 其他主机不可以和当前的服务端通信，除非客户端也在本地
#   IP:''  表示服务端绑定到所有的IP地址上，所有的客户端都可以连接
server_socket.bind(('172.1.128.64', 6666))
# server_socket.bind(('', 6666))

# 注意：recvfrom是一个阻塞函数，如果没有收到数据包，那么程序暂停不动

while True:
    # msg 是收到的数据，addr是源地址和源端口号（客户端）
    msg, addr = server_socket.recvfrom(1024)

    if msg.decode('utf8') == 'quit':  # 如果收到quit 表示终止聊天
        break

    # decode函数可以把字节数据 转化为 字符串
    print(f'来自客户端的IP:{addr[0]},端口号：{addr[1]}的消息：{msg.decode("utf8")}')

    # 服务端也可以发送数据到客户端
    send_msg = input('服务端>>')
    # sendto 发送的数据不能是字符串，只能是字节数据，字符串的encode函数
    server_socket.sendto(send_msg.encode('utf8'), addr)

# 最后要关闭socket
server_socket.close()
